블로그 릴레이 - CDK 와 Serverless express 사용해 보기
안녕하세요 생산지원 그룹 리테일 어플리케이션부의 김승연입니다.
본 블로그는 당사의 한국어 블로그 릴레이의 열여덟 번째 블로그입니다.
이번 블로그 주제는 「CDK 와 Serverless express 사용해 보기」 입니다.
Serverless express란
Serverless express 는 AWS Lambda 를 이용한 서버리스 환경에서 Express를 사용한 REST API를 구축할 수 있게 도와주는 라이브러리라는 듯 합니다.
CDK를 깊게 다뤄보지 않아 보통의 CDK + AWS Lambda 구성에 비해 어떤 이점이 있는지는 아직 경험해 보지 않았지만, CDK + Serverless express 구성이라면 라우팅 구성 등에 이점이 있는 것 같습니다.
준비
Directory 구성
보통 mono repogitory로 많이 구성하는 듯하여 이번에는 아래의 구조로 프로젝트를 구성해 보았습니다.
참고로 mono repogitory 구성에는 workspaces를 이용하였습니다.
최종적으로는 아래의 구성으로 만들고 있습니다.
root
- packages
- iac ← CDK 구성
- server ← Serverless express 구성
package.json
...
root/package.json
{
"name": "root",
"private": true,
...
"scripts": {
...
},
...
"workspaces": [
"packages/server",
"packages/iac"
]
}
CDK 생성 + 관련 라이브러리 설치
root/iac
npx cdk init --language typescript
Serverless Express + 관련 라이브러리 설치
root/server
npm install express
npm install @codegenie/serverless-express
npm install cors
npm install --save-dev @types/cors
코드 작성
코드 작성은 사내의 아래의 블로그를 참고로 작성했습니다.
Serverless Express + AWS Lambda + API Gateway의 구성으로 AWS CDK 을 작성해 보았다
lib/iac-stack.ts
...
// Lambda
const restApiFunc = new cdk.aws_lambda_nodejs.NodejsFunction(
this,
'RestApiFunc',
{
architecture: cdk.aws_lambda.Architecture.ARM_64,
runtime: cdk.aws_lambda.Runtime.NODEJS_20_X,
entry: "../server/src/index.ts",
}
);
// APIGateway REST API
const restApi = new cdk.aws_apigateway.LambdaRestApi(this, 'RestApi', {
handler: restApiFunc,
defaultCorsPreflightOptions: {
allowOrigins: cdk.aws_apigateway.Cors.ALL_ORIGINS,
allowMethods: cdk.aws_apigateway.Cors.ALL_METHODS,
allowHeaders: cdk.aws_apigateway.Cors.DEFAULT_HEADERS,
maxAge: cdk.Duration.minutes(5),
},
deployOptions: {
stageName: 'v1',
tracingEnabled: false,
},
});
// API Gateway EndPoint
new cdk.CfnOutput(this, 'RestApiEndpoint', {
value: restApi.deploymentStage.urlForPath(),
});
...
server/src/index.ts
import serverlessExpress from '@codegenie/serverless-express';
import cors from 'cors';
import express, { Request, Response } from 'express';
const app = express();
app.use(cors());
app.use(express.json());
app.get('/', async (_req: Request, res: Response): Promise<void> => {
res.status(200).send("Hello serverless express!");
});
export const handler = serverlessExpress({ app });
확인
준비가 끝났다면 CDK를 Deploy를 해줍니다.
npm run cdk bootstrap ← 최초만 실행
npm run cdk deploy
마지막으로 아래를 통해 제대로 API가 실행되는지 확인해 주시면 됩니다.
curl -X GET -H "Content-Type: application/json" https://xxxxxxxx.execute-api.[region].amazonaws.com/v1/
이상, 한국어 블로그 릴레이의 열여덟 번째 「CDK 와 Serverless express 사용해 보기」 였습니다. 다음 열아홉 번째 블로그 릴레이는 11월 첫째 주에 공개됩니다.
끝까지 읽어주셔서 감사합니다!
참고자료
Serverless Express + AWS Lambda + API Gateway 의 구성으로 AWS CDK 을 작성해보았다
Serverless Express